home *** CD-ROM | disk | FTP | other *** search
/ Aminet 25 / Aminet 25 (1998)(GTI - Schatztruhe)[!][Jun 1998].iso / Aminet / comm / net / AMarquee1_48.lha / AMarquee / examples / amarqueedebug.cpp < prev    next >
C/C++ Source or Header  |  1998-04-10  |  7KB  |  165 lines

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4.  
  5. #include <dos/dos.h>
  6. #include <clib/dos_protos.h>
  7. #include <clib/exec_protos.h>
  8.  
  9. // This is a version of AMarqueeDebug written to use the
  10. // "Session" C++ wrapper class.  It should work more or
  11. // less exactly the same as the original C version
  12. // (amarqueedebug.c)
  13.  
  14. #include "include:signal.h"  // for sig_ign()
  15.  
  16. // Make sure you -I the directory where this file is!
  17. #include "Session.h"
  18.  
  19. struct Library * AMarqueeBase = NULL;
  20.  
  21. /* Takes user input until blank line is typed */
  22. void ProcessDebugCommands(Session & session)
  23. {
  24.   while(1)
  25.   {
  26.    char debugline[500] = "\0\0\0\0\0\0\0\0";
  27.    char * keyword, * data;
  28.    ULONG dataLen = 0L;
  29.    LONG res;
  30.    
  31.    printf("Enter your debug command now: "); fflush(stdout);
  32.    gets(debugline);
  33.   
  34.    keyword = &debugline[2];
  35.    if (data = strchr(keyword,'='))
  36.    {
  37.      *data = '\0';  /* terminate the keyword */
  38.      data++;
  39.      dataLen = strlen(data)+1;
  40.    }
  41.    switch((int)(debugline[0]))
  42.    {
  43.      case '\0': res=session.go();                                break;
  44.      case 'A':  res=session.setMessageAccessOp(keyword);         break;
  45.      case 'm':  res=session.messageOp(keyword, data, dataLen);   break;
  46.      case 'M':  res=session.sysMessageOp(keyword, data);         break;
  47.      case 'a':  res=session.setAccessOp(keyword);                break;
  48.      case 's':  res=session.setOp(keyword, data, dataLen);       break;
  49.      case 'S':  res=session.streamOp(keyword, data, dataLen);    break;
  50.      case 'r':  res=session.renameOp(keyword, data);             break;
  51.      case 'D':  res=session.debugOp(keyword);                    break;
  52.      case 'g':  res=session.getOp(keyword);                      break;
  53.      case 'd':  res=session.deleteOp(keyword);                   break;
  54.      case 'i':  res=session.infoOp();                            break;
  55.      case 'c':  res=session.subscribeOp(keyword);                break;
  56.      case 'C':  res=session.getAndSubscribeOp(keyword);          break;
  57.      case 'k':  res=session.clearSubscriptionsOp(atoi(keyword)); break;
  58.      case 'p':  res=session.pingOp();                            break;
  59.      case 'v':  res=session.requestPrivilegesOp(atol(keyword));  break;
  60.      case 'w':  res=session.releasePrivilegesOp(atol(keyword));  break;
  61.      case '!':  res=session.killClientsOp(keyword);              break;
  62.      case '?':  res=session.getParameterOp(keyword);             break;
  63.      case '$':  res=session.setParameterOp(keyword,data);        break;
  64.      default:   printf("Command code %c was not recognized.\n",debugline[0]); break;
  65.    }
  66.    printf("(Op result was %i)\n",res);
  67.    if (debugline[0] == '\0') return;
  68.   }
  69. }
  70.  
  71.  
  72. /* Main program */
  73. int main(int argc, char ** argv)
  74. {
  75.   char * connectTo, * progName;
  76.   int port;
  77.     
  78.   signal(SIGINT, SIG_IGN);  /* Don't let the compiler abort us abruptly on CTRL-C */
  79.  
  80.   printf("Usage Note:  AMarqueeDebug [hostname=localhost] [myname=debug] [port=2957]\n");    
  81.   
  82.   connectTo = (argc>1) ? argv[1] : "localhost";
  83.   progName  = (argc>2) ? argv[2] : "debug";
  84.   port      = (argc>3) ? atoi(argv[3]) : 2957;
  85.  
  86.   if ((AMarqueeBase = OpenLibrary("amarquee.library",46L)) == NULL)
  87.   {
  88.     printf("Couldn't open amarquee.library v46!\n");
  89.     exit(RETURN_ERROR);
  90.   }
  91.   printf("Connecting to %s:%i\n",connectTo, port);
  92.  
  93.   try {
  94.     Session session(connectTo, port, progName);  // Connect attempt happens here (disconnects when scope is exited)
  95.     
  96.     printf("Connected to server %s:%i\n",connectTo, port);
  97.  
  98.     printf("Commands are:\n");
  99.     printf("\n");
  100.     printf("a wildhostpath   Access control (default is /#?/#?)\n");
  101.     printf("A wildhostpath   Access control for incoming messages (default in no access)\n");
  102.     printf("m hosts=data     Send an active message to hosts\n");
  103.     printf("M hosts=string   Send an system message to hosts\n");
  104.     printf("s path=data      Set data node value\n");
  105.     printf("S path=data      Stream data node value\n");
  106.     printf("r path=newlabel  Rename data node\n");
  107.     printf("D debugstring    Send debug string\n");
  108.     printf("g wildpath       Get a node or nodes\n");
  109.     printf("c wildpath       Subscribe to a node or nodes\n");
  110.     printf("C wildpath       Get&Subscribe to a node or nodes\n");
  111.     printf("k opID           Klear subscriptions (by id or 0 for all)\n");
  112.     printf("d wildpath       Delete a node or nodes\n");
  113.     printf("i                Request info packet\n");
  114.     printf("p                Request ping packet\n");
  115.     printf("v #              Request new privileges (by code bitchord)\n");
  116.     printf("w #              Release existing privileges (by code bitchord)\n");
  117.     printf("! hosts          Kill other clients (requires KILLCLIENTS privilege!)\n");
  118.     printf("$ param=string   Set a parameter with setParam()\n");
  119.     printf("? param          Get a parameter by name\n");
  120.     printf("<enter>          Send accumulated transactions (GO!!)\n");
  121.     printf("\n");
  122.     printf("Press CTRL-F to enter commands, or CTRL-C to quit\n");
  123.   
  124.     while(1)
  125.     {
  126.       ULONG signals = (1L << session.getMsgPort()->mp_SigBit) | (SIGBREAKF_CTRL_C) | (SIGBREAKF_CTRL_F);
  127.  
  128.       /* Wait for next message from the server */
  129.       signals = Wait(signals);
  130.     
  131.       if (signals & (1L << session.getMsgPort()->mp_SigBit))
  132.       {
  133.         struct QMessage * qMsg;
  134.   
  135.         while(qMsg = (struct QMessage *) GetMsg(session.getMsgPort()))
  136.         {
  137.           struct QRunInfo * inf = (qMsg->qm_DataLen == sizeof(struct QRunInfo)) ? ((struct QRunInfo *) qMsg->qm_Data) : NULL;
  138.  
  139.           /* Handle message */
  140.           printf("Message %p recieved---------\n",qMsg);
  141.           printf("Status:       %i (%s)\n",  qMsg->qm_Status, Session::getErrorName(qMsg->qm_Status));
  142.           printf("Error Line:   %i\n",  qMsg->qm_ErrorLine);
  143.           printf("Message ID:   %i\n",  qMsg->qm_ID);
  144.           printf("Path:        [%s]\n", qMsg->qm_Path?qMsg->qm_Path:"<NULL>");
  145.           printf("Data:        [%s](int=%i)\n", qMsg->qm_Data?qMsg->qm_Data:((UBYTE*)"<NULL>"),qMsg->qm_Data?(*((int*)qMsg->qm_Data)):0);
  146.           printf("DataLen:      %lu\n", qMsg->qm_DataLen);
  147.           printf("ActualLen:    %lu\n", qMsg->qm_ActualLen);
  148.  
  149.           if (inf) printf("Info: alloced:%li allowed:%li avail:%li curPrivs=0x%x posPrivs=0x%x\n",
  150.             inf->qr_Alloced, inf->qr_Allowed, inf->qr_Avail, inf->qr_CurrentPrivs, inf->qr_PossiblePrivs); 
  151.           
  152.           session.freeQMessage(qMsg);
  153.         }
  154.       }
  155.       if (signals & SIGBREAKF_CTRL_F) ProcessDebugCommands(session);
  156.       if (signals & SIGBREAKF_CTRL_C) break;  /* Quit if CTRL-C pressed */
  157.     }
  158.   }
  159.   catch(SessionCreationFailedException)
  160.   {
  161.     printf("Error, AMarquee connection couldn't be made.\n");
  162.   }  
  163.   CloseLibrary(AMarqueeBase);  
  164. }
  165.